package com.design_patterns.iterator.v4;


/**
 * @author: 李德才
 * @description:
 * @create: 2020-09-01 20:53
 **/
public class LinkedList_<E> implements Collection_<E> {
    private Node head = null;
    private Node tail = null;
    private int size = 0;

    public Integer size() {
        return size;
    }

    public LinkedList_<E> add(E object) {
        Node node = new Node(object);
        node.next = null;
        if (head == null) {
            head = node;
            tail = node;
        }
        /**
         * 将当前最后一个Node 的下一个对象的指针指向新对象
         */
        tail.next = node;
        /**
         * 将最后一个对象转变为新对象
         * tail 是一个灵活的代表最后一个对象的指针，不要想象成数组一样的下标
         */
        tail = node;

        /**
         * 重新捋顺 tail
         * 第一次添加之后 tail 为第一个对象 （A）
         * 第二次添加，tail.next = node; 将 (A) 的next 指向了新对象 (B),然后把 （B） 作为最后一个对象
         * 第二次添加，tail.next = node; 将 (B) 的next 指向了新对象 (C),然后把 （C） 作为最后一个对象
         * 如此便得到了一个 node 的链表，每一个 node 的 next 都指向了下一个对象
         */
        size++;
        return this;
    }


    @Override
    public Iterator_ iterator() {
        return new LinkedListIterator();
    }


    class LinkedListIterator implements Iterator_ {
        private Node currentHeader = head;

        @Override
        public boolean hasNext() {
            if (currentHeader == head && currentHeader != null) {
                return true;
            }
            return currentHeader != null;
        }

        @Override
        public Object next() {
            Node next = currentHeader;
            currentHeader = currentHeader.next;
            return next;
        }
    }

}

class Node {
    public Object element;
    public Node next;

    public Node(Object element) {
        this.element = element;
    }

    public Object getElement() {
        return element.toString();
    }

    @Override
    public String toString() {
        return "Node{" +
                "element=" + element +
                '}';
    }
}
